home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / gcc263-src.lha / gcc-2.6.3 / config / nextstep.h < prev    next >
C/C++ Source or Header  |  1994-05-02  |  19KB  |  567 lines

  1. /* nextstep.h -- operating system specific defines to be used when
  2.    targeting GCC for NeXTSTEP.
  3.    Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
  4.  
  5. This file is part of GNU CC.
  6.  
  7. GNU CC is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11.  
  12. GNU CC is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU CC; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. /* Use new NeXT include file search path.
  22.    In a cross compiler with NeXT as target, don't expect
  23.    the host to use Next's directory scheme.  */
  24.  
  25. #ifndef CROSS_COMPILE
  26. #undef    INCLUDE_DEFAULTS
  27. #define INCLUDE_DEFAULTS                \
  28.   {                            \
  29.     { GPLUSPLUS_INCLUDE_DIR, 1, 1 },            \
  30.     { LOCAL_INCLUDE_DIR, 0, 1 },            \
  31.     { TOOL_INCLUDE_DIR, 0, 1 },                \
  32.     { GCC_INCLUDE_DIR, 0, 0 },                \
  33.     /* These are for fixincludes-fixed ansi/bsd headers    \
  34.        which wouldn't be found otherwise.        \
  35.        (The use of string catenation here is OK since    \
  36.     NeXT's native compiler is derived from GCC.) */    \
  37.     { GCC_INCLUDE_DIR "/ansi", 0, 0 },            \
  38.     { GCC_INCLUDE_DIR "/bsd", 0, 0 },            \
  39.     { "/NextDeveloper/Headers", 0, 0 },            \
  40.     { "/NextDeveloper/Headers/ansi", 0, 0 },        \
  41.     { "/NextDeveloper/Headers/bsd", 0, 0 },        \
  42.     { "/LocalDeveloper/Headers", 0, 0 },        \
  43.     { "/LocalDeveloper/Headers/ansi", 0, 0 },        \
  44.     { "/LocalDeveloper/Headers/bsd", 0, 0 },        \
  45.     { "/NextDeveloper/2.0CompatibleHeaders", 0, 0 },    \
  46.     { STANDARD_INCLUDE_DIR, 0, 0 },            \
  47.     { "/usr/include/bsd", 0, 0 },            \
  48.     { 0, 0, 0 }                        \
  49.   }
  50. #endif /* CROSS_COMPILE */
  51.  
  52. #undef    EXTRA_FORMAT_FUNCTIONS
  53. #define EXTRA_FORMAT_FUNCTIONS \
  54.       "NXPrintf",    FALSE,    2,    FALSE,    \
  55.       "NXScanf",    TRUE,    2,    FALSE,    \
  56.       "NXVPrintf",    FALSE,    2,    TRUE,    \
  57.       "NXVScanf",    TRUE,    2,    TRUE,    \
  58.       "DPSPrintf",    FALSE,    2,    FALSE,    \
  59.       "bsd_sprintf",    FALSE,    2,    FALSE,    \
  60.       "bsd_vsprintf",    FALSE,    2,    TRUE,
  61.  
  62. /* Make -fnext-runtime the default.  */
  63.  
  64. #define NEXT_OBJC_RUNTIME
  65.  
  66. /* We have atexit.  */
  67.  
  68. #define HAVE_ATEXIT
  69.  
  70. /* Enable recent gcc to compile under the old gcc in Next release 1.0.  */
  71.  
  72. #define __inline inline
  73.  
  74. /* wchar_t is unsigned short */
  75.  
  76. #undef    WCHAR_TYPE
  77. #define WCHAR_TYPE "short unsigned int"
  78. #undef    WCHAR_TYPE_SIZE
  79. #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
  80.  
  81. /* Don't default to pcc-struct-return, because gcc is the only compiler, and
  82.    we want to retain compatibility with older gcc versions.  */
  83.  
  84. #undef    DEFAULT_PCC_STRUCT_RETURN
  85. #define DEFAULT_PCC_STRUCT_RETURN 0
  86.  
  87. /* These compiler options take n arguments.  */
  88.  
  89. #undef    WORD_SWITCH_TAKES_ARG
  90. #define WORD_SWITCH_TAKES_ARG(STR)         \
  91.   (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 :    \
  92.    !strcmp (STR, "segalign") ? 1 :        \
  93.    !strcmp (STR, "seg1addr") ? 1 :        \
  94.    !strcmp (STR, "segaddr") ? 2 :        \
  95.    !strcmp (STR, "sectobjectsymbols") ? 2 :    \
  96.    !strcmp (STR, "segprot") ? 3 :        \
  97.    !strcmp (STR, "sectcreate") ? 3 :        \
  98.    !strcmp (STR, "sectalign") ? 3 :        \
  99.    !strcmp (STR, "segcreate") ? 3 :        \
  100.    !strcmp (STR, "sectorder") ? 3 :        \
  101.    !strcmp (STR, "siff-mask") ? 1 :        \
  102.    !strcmp (STR, "siff-filter") ? 1 :        \
  103.    !strcmp (STR, "siff-warning") ? 1 :        \
  104.    !strcmp (STR, "arch") ? 1 :            \
  105.    !strcmp (STR, "pagezero_size") ? 1 :        \
  106.    0)
  107.  
  108. #undef    WORD_SWITCH
  109. #define WORD_SWITCH(STR)            \
  110.   (WORD_SWITCH_TAKES_ARG (STR)            \
  111.    || !strcmp (STR, "bsd")            \
  112.    || !strcmp (STR, "object")            \
  113.    || !strcmp (STR, "ObjC")            \
  114.    || !strcmp (STR, "all_load"))
  115.  
  116. /* Machine dependent ccp options.  */
  117.  
  118. #undef    CPP_SPEC
  119. #define CPP_SPEC "%{!traditional: -D__STDC__}            \
  120.                   %{posixstrict:-D_POSIX_SOURCE}         \
  121.                   %{!posixstrict:%{bsd:-D__STRICT_BSD__} \
  122.                   %{posix:-D_POSIX_SOURCE}               \
  123.                   %{!ansi:-D_NEXT_SOURCE}}               \
  124.                   %{MD:-MD %M} %{MMD:-MMD %M}"
  125.  
  126. /* Machine dependent ld options.  */
  127.  
  128. #undef    LINK_SPEC
  129. #define LINK_SPEC "%{Z} %{M} \
  130. %{execute*} %{preload*} %{fvmlib*} \
  131. %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
  132. %{pagezero_size*} \
  133. %{seglinkedit*} %{noseglinkedit*} \
  134. %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
  135. %{segcreate*} %{Mach*} %{whyload} %{w} \
  136. %{sectorder*} %{whatsloaded} %{ObjC} %{all_load} %{object}"
  137.  
  138. /* Machine dependent libraries.  */
  139.  
  140. #undef    LIB_SPEC
  141. #define LIB_SPEC "%{!posix*:-lsys_s} %{posix*:-lposix}"
  142.  
  143. /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
  144.  
  145. #undef    STARTFILE_SPEC
  146. #define STARTFILE_SPEC  \
  147.     "%{!posix*:%{pg:-lgcrt0.o}%{!pg: \
  148.      %{p:%e-p profiling is no longer supported.  Use -pg instead.} \
  149.      %{!p:-lcrt0.o}}}\
  150.      %{posix*:%{pg:-lgposixcrt0.o}%{!pg: \
  151.      %{p:%e-p profiling is no longer supported.  Use -pg instead.} \
  152.      %{!p:-lposixcrt0.o}}}"
  153.  
  154. /* Why not? */
  155.  
  156. #undef    DOLLARS_IN_IDENTIFIERS
  157. #define DOLLARS_IN_IDENTIFIERS 2
  158.  
  159. /* Allow #sscs (but don't do anything). */
  160.  
  161. #define SCCS_DIRECTIVE
  162.  
  163. /* We use Dbx symbol format.  */
  164.  
  165. #undef    SDB_DEBUGGING_INFO
  166. #undef    XCOFF_DEBUGGING_INFO
  167. #define DBX_DEBUGGING_INFO
  168.  
  169. /* This saves a fair amount of space. */
  170.  
  171. #undef    DBX_CONTIN_LENGTH
  172. #define DBX_CONTIN_LENGTH 0
  173.  
  174. /* These screw up NeXT's gdb at the moment, so don't use them. */
  175.  
  176. #undef    DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
  177. #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
  178.  
  179. /* These come from bsd386.h, but are specific to sequent, so make sure
  180.    they don't bite us.  */
  181.  
  182. #undef    DBX_NO_XREFS
  183. #undef    DBX_CONTIN_LENGTH
  184.  
  185. /* gdb needs a null N_SO at the end of each file for scattered loading. */
  186.  
  187. #undef    DBX_OUTPUT_MAIN_SOURCE_FILE_END
  188. #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)            \
  189.   fprintf (FILE,                            \
  190.        "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n",        \
  191.        "" , N_SO)
  192.  
  193. /* Don't use .gcc_compiled symbols to communicate with GDB;
  194.    They interfere with numerically sorted symbol lists. */
  195.  
  196. #undef    ASM_IDENTIFY_GCC
  197. #define ASM_IDENTIFY_GCC(asm_out_file)
  198. #undef    INIT_SECTION_ASM_OP
  199. #define INIT_SECTION_ASM_OP
  200. #undef    INVOKE__main
  201.  
  202. #undef    ASM_OUTPUT_CONSTRUCTOR
  203. #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                       \
  204.   do { constructor_section ();                                  \
  205.        ASM_OUTPUT_ALIGN (FILE, 1);                              \
  206.        fprintf (FILE, "\t.long ");                              \
  207.        assemble_name (FILE, NAME);                              \
  208.        fprintf (FILE, "\n");                                    \
  209.        fprintf (FILE, ".reference .constructors_used\n");       \
  210.       } while (0)
  211.  
  212. #undef    ASM_OUTPUT_DESTRUCTOR
  213. #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                        \
  214.   do { destructor_section ();                                   \
  215.        ASM_OUTPUT_ALIGN (FILE, 1);                              \
  216.        fprintf (FILE, "\t.long ");                              \
  217.        assemble_name (FILE, NAME);                              \
  218.        fprintf (FILE, "\n");                                    \
  219.        fprintf (FILE, ".reference .destructors_used\n");        \
  220.       } while (0)
  221.  
  222. /* Don't output a .file directive.  That is only used by the assembler for
  223.    error reporting.  */
  224. #undef    ASM_FILE_START
  225. #define ASM_FILE_START(FILE)
  226.  
  227. #undef    ASM_FILE_END
  228. #define ASM_FILE_END(FILE)                    \
  229.   do {                                \
  230.     extern char *language_string;                \
  231.     if (strcmp (language_string, "GNU C++") == 0)        \
  232.       {                                \
  233.     constructor_section ();                    \
  234.     destructor_section ();                    \
  235.     ASM_OUTPUT_ALIGN (FILE, 1);                \
  236.       }                                \
  237.   } while (0)
  238.  
  239. /* How to parse #pragma's */
  240.  
  241. #undef    HANDLE_PRAGMA
  242. #define HANDLE_PRAGMA(finput) handle_pragma (finput, &get_directive_line)
  243.  
  244. /* Give methods pretty symbol names on NeXT. */
  245.  
  246. #undef    OBJC_GEN_METHOD_LABEL
  247. #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
  248.   do { if (CAT_NAME)                            \
  249.      sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',        \
  250.           (CLASS_NAME), (CAT_NAME), (SEL_NAME));        \
  251.        else                                \
  252.      sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',        \
  253.           (CLASS_NAME), (SEL_NAME));                \
  254.      } while (0)
  255.  
  256. /* Wrap new method names in quotes so the assembler doesn't gag.
  257.    Make Objective-C internal symbols local.  */
  258.  
  259. #undef    ASM_OUTPUT_LABELREF
  260. #define ASM_OUTPUT_LABELREF(FILE,NAME)    \
  261.   do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
  262.        else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME);   \
  263.        else if (!strncmp (NAME, ".objc_class_name_", 17))        \
  264.      fprintf (FILE, "%s", NAME);                    \
  265.        else fprintf (FILE, "_%s", NAME); } while (0)
  266.  
  267. #undef    ALIGN_ASM_OP
  268. #define ALIGN_ASM_OP        ".align"
  269.  
  270. #undef    ASM_OUTPUT_ALIGN
  271. #define ASM_OUTPUT_ALIGN(FILE,LOG)    \
  272.   if ((LOG) != 0)            \
  273.     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
  274.  
  275. /* Ensure correct alignment of bss data.  */
  276.  
  277. #undef    ASM_OUTPUT_ALIGNED_LOCAL
  278. #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
  279. ( fputs (".lcomm ", (FILE)),                \
  280.   assemble_name ((FILE), (NAME)),            \
  281.   fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
  282.  
  283. /* Output #ident as a .ident.  */
  284.  
  285. #undef    ASM_OUTPUT_IDENT
  286. #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
  287.  
  288. /* The maximum alignment which the object file format can support.
  289.    For NeXT's Mach-O format, this is 2^15.  */
  290.  
  291. #undef    MAX_OFILE_ALIGNMENT
  292. #define MAX_OFILE_ALIGNMENT 0x8000
  293.  
  294. /* Create new Mach-O sections. */
  295.  
  296. #undef    SECTION_FUNCTION
  297. #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC)    \
  298. void                                    \
  299. FUNCTION ()                                \
  300. {                                    \
  301.   extern void text_section ();                         \
  302.   extern void objc_section_init ();                    \
  303.   extern int flag_no_mach_text_sections;                \
  304.                                       \
  305.   if (WAS_TEXT && flag_no_mach_text_sections)                   \
  306.     text_section ();                            \
  307.   else if (in_section != SECTION)                    \
  308.     {                                    \
  309.       if (OBJC)                                \
  310.     objc_section_init ();                        \
  311.       fprintf (asm_out_file, "%s\n", DIRECTIVE);            \
  312.       in_section = SECTION;                        \
  313.     }                                    \
  314. }                                    \
  315.  
  316. #undef    EXTRA_SECTIONS
  317. #define EXTRA_SECTIONS                    \
  318.   in_const, in_cstring, in_literal4, in_literal8,    \
  319.   in_constructor, in_destructor,            \
  320.   in_objc_class, in_objc_meta_class, in_objc_category,    \
  321.   in_objc_class_vars, in_objc_instance_vars,        \
  322.   in_objc_cls_meth, in_objc_inst_meth,            \
  323.   in_objc_cat_cls_meth, in_objc_cat_inst_meth,        \
  324.   in_objc_selector_refs,                \
  325.   in_objc_symbols, in_objc_module_info,            \
  326.   in_objc_protocol, in_objc_string_object,        \
  327.   in_objc_class_names, in_objc_meth_var_names,        \
  328.   in_objc_meth_var_types, in_objc_cls_refs
  329.  
  330. #undef    EXTRA_SECTION_FUNCTIONS
  331. #define EXTRA_SECTION_FUNCTIONS            \
  332. SECTION_FUNCTION (const_section,        \
  333.           in_const,            \
  334.           ".const", 1, 0)        \
  335. SECTION_FUNCTION (cstring_section,        \
  336.           in_cstring,            \
  337.           ".cstring", 1, 0)        \
  338. SECTION_FUNCTION (literal4_section,        \
  339.           in_literal4,            \
  340.           ".literal4", 1, 0)        \
  341. SECTION_FUNCTION (literal8_section,        \
  342.           in_literal8,            \
  343.           ".literal8", 1, 0)        \
  344. SECTION_FUNCTION (constructor_section,        \
  345.           in_constructor,        \
  346.           ".constructor", 0, 0)        \
  347. SECTION_FUNCTION (destructor_section,        \
  348.           in_destructor,        \
  349.           ".destructor", 0, 0)        \
  350. SECTION_FUNCTION (objc_class_section,        \
  351.           in_objc_class,        \
  352.           ".objc_class", 0, 1)        \
  353. SECTION_FUNCTION (objc_meta_class_section,    \
  354.           in_objc_meta_class,        \
  355.           ".objc_meta_class", 0, 1)    \
  356. SECTION_FUNCTION (objc_category_section,    \
  357.           in_objc_category,        \
  358.         ".objc_category", 0, 1)        \
  359. SECTION_FUNCTION (objc_class_vars_section,    \
  360.           in_objc_class_vars,        \
  361.           ".objc_class_vars", 0, 1)    \
  362. SECTION_FUNCTION (objc_instance_vars_section,    \
  363.           in_objc_instance_vars,    \
  364.           ".objc_instance_vars", 0, 1)    \
  365. SECTION_FUNCTION (objc_cls_meth_section,    \
  366.           in_objc_cls_meth,        \
  367.           ".objc_cls_meth", 0, 1)    \
  368. SECTION_FUNCTION (objc_inst_meth_section,    \
  369.           in_objc_inst_meth,        \
  370.           ".objc_inst_meth", 0, 1)    \
  371. SECTION_FUNCTION (objc_cat_cls_meth_section,    \
  372.           in_objc_cat_cls_meth,        \
  373.           ".objc_cat_cls_meth", 0, 1)    \
  374. SECTION_FUNCTION (objc_cat_inst_meth_section,    \
  375.           in_objc_cat_inst_meth,    \
  376.           ".objc_cat_inst_meth", 0, 1)    \
  377. SECTION_FUNCTION (objc_selector_refs_section,    \
  378.           in_objc_selector_refs,    \
  379.           ".objc_message_refs", 0, 1)    \
  380. SECTION_FUNCTION (objc_symbols_section,        \
  381.           in_objc_symbols,        \
  382.           ".objc_symbols", 0, 1)    \
  383. SECTION_FUNCTION (objc_module_info_section,    \
  384.           in_objc_module_info,        \
  385.           ".objc_module_info", 0, 1)    \
  386. SECTION_FUNCTION (objc_protocol_section,    \
  387.           in_objc_protocol,        \
  388.           ".objc_protocol", 0, 1)    \
  389. SECTION_FUNCTION (objc_string_object_section,    \
  390.           in_objc_string_object,    \
  391.           ".objc_string_object", 0, 1)    \
  392. SECTION_FUNCTION (objc_class_names_section,    \
  393.         in_objc_class_names,        \
  394.         ".objc_class_names", 0, 1)    \
  395. SECTION_FUNCTION (objc_meth_var_names_section,    \
  396.         in_objc_meth_var_names,        \
  397.         ".objc_meth_var_names", 0, 1)    \
  398. SECTION_FUNCTION (objc_meth_var_types_section,    \
  399.         in_objc_meth_var_types,        \
  400.         ".objc_meth_var_types", 0, 1)    \
  401. SECTION_FUNCTION (objc_cls_refs_section,    \
  402.         in_objc_cls_refs,        \
  403.         ".objc_cls_refs", 0, 1)        \
  404.                         \
  405. void                        \
  406. objc_section_init ()                \
  407. {                        \
  408.   static int been_here = 0;            \
  409.                         \
  410.   if (been_here == 0)                \
  411.     {                        \
  412.       been_here = 1;                \
  413.       objc_class_section ();            \
  414.       objc_meta_class_section ();        \
  415.       objc_cat_cls_meth_section ();        \
  416.       objc_cat_inst_meth_section ();        \
  417.       objc_cls_meth_section ();            \
  418.       objc_inst_meth_section ();        \
  419.       objc_selector_refs_section ();        \
  420.       objc_symbols_section ();            \
  421.       objc_category_section ();            \
  422.       objc_protocol_section ();            \
  423.       objc_class_vars_section ();        \
  424.       objc_instance_vars_section ();        \
  425.       objc_module_info_section ();        \
  426.       objc_string_object_section ();        \
  427.       objc_class_names_section ();        \
  428.       objc_meth_var_names_section ();        \
  429.       objc_meth_var_types_section ();        \
  430.       objc_cls_refs_section ();            \
  431.     }                        \
  432. }
  433.  
  434. #undef    READONLY_DATA_SECTION
  435. #define READONLY_DATA_SECTION const_section
  436.  
  437. #undef    SELECT_SECTION
  438. #define SELECT_SECTION(exp,reloc)                \
  439.   do                                \
  440.     {                                \
  441.       if (TREE_CODE (exp) == STRING_CST)            \
  442.     {                            \
  443.       if (flag_writable_strings)                \
  444.         data_section ();                    \
  445.       else if (TREE_STRING_LENGTH (exp) !=            \
  446.            strlen (TREE_STRING_POINTER (exp)) + 1)    \
  447.         readonly_data_section ();                \
  448.       else                            \
  449.         cstring_section ();                    \
  450.     }                            \
  451.       else if (TREE_CODE (exp) == INTEGER_CST            \
  452.            || TREE_CODE (exp) == REAL_CST)            \
  453.         {                            \
  454.       tree size = TYPE_SIZE (TREE_TYPE (exp));        \
  455.                                   \
  456.       if (TREE_CODE (size) == INTEGER_CST &&        \
  457.           TREE_INT_CST_LOW (size) == 4 &&            \
  458.           TREE_INT_CST_HIGH (size) == 0)            \
  459.         literal4_section ();                \
  460.       else if (TREE_CODE (size) == INTEGER_CST &&        \
  461.           TREE_INT_CST_LOW (size) == 8 &&            \
  462.           TREE_INT_CST_HIGH (size) == 0)            \
  463.         literal8_section ();                \
  464.       else                            \
  465.         readonly_data_section ();                \
  466.     }                            \
  467.       else if (TREE_CODE (exp) == CONSTRUCTOR                \
  468.            && TREE_TYPE (exp)                    \
  469.            && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE        \
  470.            && TYPE_NAME (TREE_TYPE (exp))                \
  471.            && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
  472.            && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))))    \
  473.     {                                \
  474.       if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
  475.             "NXConstantString"))                \
  476.       objc_string_object_section ();                \
  477.     else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))        \
  478.         && !TREE_SIDE_EFFECTS (exp))                \
  479.       readonly_data_section ();                    \
  480.     else                                \
  481.       data_section ();                        \
  482.       }                                    \
  483.       else if (TREE_CODE (exp) == VAR_DECL &&                \
  484.            DECL_NAME (exp) &&                    \
  485.            TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&    \
  486.            IDENTIFIER_POINTER (DECL_NAME (exp)) &&            \
  487.            !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
  488.     {                                \
  489.       const char *name = IDENTIFIER_POINTER (DECL_NAME (exp));    \
  490.                                       \
  491.       if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))        \
  492.         objc_cls_meth_section ();                    \
  493.       else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))    \
  494.         objc_inst_meth_section ();                    \
  495.       else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
  496.         objc_cat_cls_meth_section ();                \
  497.       else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
  498.         objc_cat_inst_meth_section ();                \
  499.       else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))    \
  500.         objc_class_vars_section ();                    \
  501.       else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))    \
  502.         objc_instance_vars_section ();                \
  503.       else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))    \
  504.         objc_cat_cls_meth_section ();                \
  505.       else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))        \
  506.         objc_class_names_section ();                \
  507.       else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))        \
  508.         objc_meth_var_names_section ();                \
  509.       else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))        \
  510.         objc_meth_var_types_section ();                \
  511.       else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22))    \
  512.         objc_cls_refs_section ();                    \
  513.       else if (!strncmp (name, "_OBJC_CLASS_", 12))            \
  514.         objc_class_section ();                    \
  515.       else if (!strncmp (name, "_OBJC_METACLASS_", 16))        \
  516.         objc_meta_class_section ();                    \
  517.       else if (!strncmp (name, "_OBJC_CATEGORY_", 15))        \
  518.         objc_category_section ();                    \
  519.       else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))    \
  520.         objc_selector_refs_section ();                \
  521.       else if (!strncmp (name, "_OBJC_SYMBOLS", 13))        \
  522.         objc_symbols_section ();                    \
  523.       else if (!strncmp (name, "_OBJC_MODULES", 13))        \
  524.         objc_module_info_section ();                \
  525.       else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
  526.         objc_cat_inst_meth_section ();                              \
  527.       else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
  528.         objc_cat_cls_meth_section ();                               \
  529.       else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))         \
  530.         objc_cat_cls_meth_section ();                               \
  531.       else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))              \
  532.         objc_protocol_section ();                                   \
  533.       else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))        \
  534.         && !TREE_SIDE_EFFECTS (exp))                 \
  535.         readonly_data_section ();                                   \
  536.       else                                \
  537.         data_section ();                        \
  538.     }                                \
  539.       else if (TREE_CODE (exp) == VAR_DECL)                \
  540.     {                                \
  541.       if ((flag_pic && reloc)                    \
  542.           || !TREE_READONLY (exp) || TREE_SIDE_EFFECTS (exp)    \
  543.           || !DECL_INITIAL (exp)                    \
  544.           || (DECL_INITIAL (exp) != error_mark_node            \
  545.           && !TREE_CONSTANT (DECL_INITIAL (exp))))        \
  546.         data_section ();                        \
  547.       else                                \
  548.         readonly_data_section ();                    \
  549.     }                                \
  550.       else                                \
  551.     readonly_data_section ();                    \
  552.     }                                    \
  553.   while (0)
  554.  
  555. #undef    SELECT_RTX_SECTION
  556. #define SELECT_RTX_SECTION(mode, rtx)                    \
  557.   do                                    \
  558.     {                                    \
  559.       if (GET_MODE_SIZE(mode) == 8)                    \
  560.     literal8_section();                        \
  561.       else if (GET_MODE_SIZE(mode) == 4)                \
  562.     literal4_section();                        \
  563.       else                                \
  564.     const_section ();                        \
  565.     }                                    \
  566.   while (0)
  567.